package orgx.wxyz.util;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 字符串工具类
 * </p>
 * @author hyhjwzx@126.com
 * @date 2013-4-16 上午11:13:04
 */
public final class StringUtil {

	/**
	 * <p>
	 * 判断字符串是否为null或空，这个的空包括多个空格 <br>
	 * 比如：<br>
	 * StringUtil.isBlank(null) --> true <br>
	 * StringUtil.isBlank("")  --> true <br>
	 * StringUtil.isBlank("  ") --> true <br>
	 * StringUtil.isBlank("abc ") --> false <br>
	 * StringUtil.isBlank("a bc") --> false
	 * <p>
	 * @param str 字符串对象
	 * @return 验证结果
	 */
	public static boolean isBlank(String str) {
		return str == null || str.equals("") || str.trim().equals("");
	}
	
	/**
	 * <p>
	 * 判断字符串是否为null或空 <br>
	 * 比如：<br>
	 * StringUtil.isBlank(null) --> true <br>
	 * StringUtil.isBlank("")  --> true <br>
	 * StringUtil.isBlank("  ") --> false <br>
	 * StringUtil.isBlank("abc ") --> false <br>
	 * StringUtil.isBlank("a bc") --> false
	 * </p>
	 * @param str 字符串对象
	 * @return 验证结果
	 */
	public static boolean isEmpty(String str) {
		return str == null || str.equals("");
	}
	
	/**
	 * <p>
	 * 统计字符数组中的重复字符的个数
	 * </p>
	 * @param chars 字符数组
	 * @return 统计结果
	 */
	public static Map<Character, Integer> countCharForRepeat(char[] chars) {
		// 存放各个字符的个数的集合
		Map<Character, Integer> result = new HashMap<Character, Integer>();
		
		for (char c : chars) {
			Integer tmp = result.get(c);
			
			result.put(c, (tmp == null ? 1 : tmp + 1));
		}
		
		return result;
	}
	
	/**
	 * 查找给定字符串中最多的字符
	 * @param str 字符串
	 * @param result 出现最多的字符
	 * @return 返回出现最多的字符出现的次数
	 */
	public static int searchMostChar(final String str, final List<Character> result) {
		if (isBlank(str) || null == result) {
			throw new IllegalArgumentException("参数不能 空值或null");
		}
		
		// 统计所有字符的出现的次数
		Map<Character, Integer> charCount = countCharForRepeat(str.toCharArray());
		
		// 返回值集合
		Collection<Integer> values = charCount.values();
		
		// 找出最大值
		Integer maxValue = Collections.max(values);
		
		// 查找所有值和最大值相等的字符
		Iterator<Character> it = charCount.keySet().iterator();
		while (it.hasNext()) {
			Character ch = it.next();
			Integer value = charCount.get(ch);
			
			if (value.equals(maxValue)) {
				result.add(ch);
			}
		}
		
		return maxValue;
	}
}
